Shadowing is a technique employed in software development fields to test a new version of a service. When shadowing is implemented, both a previous version of the service that is live and the new version of the service run in parallel. As both versions process incoming traffic, their responses to the traffic are evaluated in parallel to detect any potential flaws in the coding, design, and operation of the new version of the service.
One drawback to shadowing relates to maintaining proper state in the data that the new version of the service processes. Shadowing typically involves creating a copy of the data used by the previous version of the service. The new version of the service can then operate on the copy of the data. However, flaws in the new version of the service may lead the copy of the data to take on erroneous states as the new version writes to it. The state errors may render the evaluation of the new version's responses ineffective and possibly misleading. Synchronizing the data between the two versions of the service can alleviate this problem for short periods of time, but new state discrepancies can occur almost immediately when the new version of the service continues to write to the data.
Another problem may occur with respect to interfacing with external services. Some external services, such as a key service that manages license keys, are limited in the sense that they cannot be copied or duplicated for shadowing purposes. Thus, a new version of a licensing service cannot interface with the key service that supports a previous (live) version of the licensing service without disrupting the live service.